package com.toomoss.USB2XXX;
import java.util.Arrays;
import java.util.List;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
public interface LDF_PARSER {
    LDF_PARSER INSTANCE  = (LDF_PARSER)Native.loadLibrary("USB2XXX",LDF_PARSER.class);
    //函数返回错误值宏定义
    public static int LDF_PARSER_OK                 =  0;///<函数执行成功
    public static int LDF_PARSER_FILE_OPEN         =(-1);///<打开文件失败
    public static int LDF_PARSER_FILE_FORMAT       =(-2);///<文件格式错误
    public static int LDF_PARSER_DEV_DISCONNECT    =(-3);///<设备未连接
    public static int LDF_PARSER_HANDLE_ERROR      =(-4);///<文件解析句柄错误
    public static int LDF_PARSER_GET_INFO_ERROR    =(-5);///<读取信息错误
    public static int LDF_PARSER_DATA_ERROR        =(-6);///<数据错误
    public static int LDF_PARSER_SLAVE_NACK        =(-7);///<从机无应答数据

    /**
     * @brief  解析LDF文件，使用LDF文件解析功能必须先调用该函数
     * @param  DevHandle 设备号，通过调用 @ref USB_ScanDevice 获取
     * @param  LINIndex LIN通道号，0-LIN1，1-LIN2，2-LIN3，3-LIN4
     * @param  isMaster 当前适配器配置为主机还是从机，0-从机，1-主机
     * @param  pLDFFileName LDF文件名称
     * @return 文件解析结果
     * @retval >0 LDF解析句柄，后续函数需要该值
     * @retval =0 文件解析失败
     */
    long LDF_ParserFile(int DevHandle, int LINIndex, byte isMaster, byte[] pLDFFileName);

    /**
     * @brief  获取LDF文件版本号
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @return LDF文件版本号
     */
    int LDF_GetProtocolVersion(long LDFHandle);

    /**
     * @brief  获取文件里面的波特率值
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @return 文件里面定义的波特率值，单位为bps
     */
    int LDF_GetLINSpeed(long LDFHandle);

    /**
     * @brief  获取文件里面定义的帧数量
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @return 解析到文件里面包含的帧数量
     */
    int LDF_GetFrameQuantity(long LDFHandle);

    /**
     * @brief  获取帧名称
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param  index 需要获取帧名称的帧索引，该值不能大于 @ref LDF_GetFrameQuantity 函数返回值
     * @param[out]  pFrameName 帧名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetFrameName(long LDFHandle, int index, byte[] pFrameName);

    /**
     * @brief  获取帧里面包含的信号数量
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @return 帧里面包含的信号数量
     */
    int LDF_GetFrameSignalQuantity(long LDFHandle, byte[] pFrameName);

    /**
     * @brief  获取帧里面的信号名称
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param  index 需要获取信号名称的信号索引，该值不能大于 @ref LDF_GetFrameSignalQuantity 函数返回值
     * @param[out]  pSignalName 信号名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetFrameSignalName(long LDFHandle, byte[] pFrameName, int index, byte[] pSignalName);

    /**
     * @brief  设置信号物理值
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param  Value 信号物理值
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     * @attention 设置的信号必须是对应帧里面的信号，否则设置值会失败
     */
    int LDF_SetSignalValue(long LDFHandle, byte[] pFrameName, byte[] pSignalName, double Value);

    /**
     * @brief  获取信号值
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param[out]  pValue 输出信号值指针
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetSignalValue(long LDFHandle, byte[] pFrameName, byte[] pSignalName, double[] pValue);

    /**
     * @brief  获取信号值字符串
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param[out]  pValueStr 信号值字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetSignalValueStr(long LDFHandle, byte[] pFrameName, char[] pSignalName, byte[] pValueStr);

    /**
     * @brief  设置帧原始数据，将原始数据传入后就能获取到解析之后的数据
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[in]  pRawData 待传入的原始数据指针
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_SetFrameRawValue(long LDFHandle, byte[] pFrameName, char[] pRawData);

    /**
     * @brief  获取帧原始数据，设置帧里面信号值之后，调用该函数可以获取到原始数据值
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[out]  pRawData 存储输出原始数据值指针
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetFrameRawValue(long LDFHandle, byte[] pFrameName, byte[] pRawData);

    /**
     * @brief  获取帧发布者，若当前适配器配置为主机模式，发布者名称若跟主机名称一致，说明该帧是主机发送给从机的
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param[out]  pPublisher 帧发布者名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetFramePublisher(long LDFHandle, byte[] pFrameName, byte[] pPublisher);

    /**
     * @brief  获取主机名称
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param  pMasterName 输出主机名称指针
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetMasterName(long LDFHandle,  byte[] pMasterName);

    /**
     * @brief  获取调度表数量
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @return LDF文件里面包含的调度表数量
     */
    int LDF_GetSchQuantity(long LDFHandle);

    /**
     * @brief  获取调度表名称
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param  index 获取调度表名称的索引号，该值不能大于 @ref LDF_GetSchQuantity 函数返回值
     * @param[out]  pSchName 调度表名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetSchName(long LDFHandle, int index, byte[] pSchName);

    /**
     * @brief  获取调度表里面包含的帧数量
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pSchName 调度表名称
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetSchFrameQuantity(long LDFHandle, byte[] pSchName);

    /**
     * @brief  获取调度表里面的帧名称
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pSchName 调度表名称字符串
     * @param  index 待获取帧名称索引号
     * @param[out]  pFrameName 帧名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_GetSchFrameName(long LDFHandle, byte[] pSchName, int index, byte[] pFrameName);

    /**
     * @brief  执行帧到总线，若该帧的发布者是主机，那么就是主机写数据，否则就是主机读数据
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pFrameName 帧名称字符串
     * @param  FillBitValue 未使用的位填充值，可以设置为0或者1
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_ExeFrameToBus(long LDFHandle, byte[] pFrameName, byte FillBitValue);

    /**
     * @brief  执行调度表到总线，若调度表里面包含多个帧，那么每个帧都会执行到总线
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pSchName 调度表名称
     * @param  FillBitValue 未使用的位填充值，可以设置为0或者1
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_ExeSchToBus(long LDFHandle, byte[] pSchName, byte FillBitValue);

    /**
     * @brief  将LDF里面的调度表配置到适配器内部自动执行
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[in]  pSchName 调度表名称
     * @param  FillBitValue 未使用的位填充值，可以设置为0或者1
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int LDF_SetSchToTable(long LDFHandle, byte[] pSchName, byte FillBitValue);

    /**
     * @brief  或者执行帧或者执行调度表后在总线上发送的原始帧数据
     * @param  LDFHandle LDF解析句柄，通过调用 @ref LDF_ParserFile 函数获取
     * @param[out]  pLINMsg 存储帧数据缓冲区
     * @param  BufferSize 存储帧数据缓冲区大小
     * @return 函数执行状态
     * @retval >=0 成功获取到的帧数
     * @retval <0 函数调用失败
     */
    int LDF_GetRawMsg(long LDFHandle, USB2LIN_EX.LIN_EX_MSG[] pLINMsg, int BufferSize);
}
